import pako from 'pako'
import { isString } from './is'

//解决数据过大和中文乱码
const Utf8ArrayToStr = (array:any[]) => {
  var out, i, len, c
  var char2, char3

  out = ''
  len = array.length
  i = 0
  while (i < len) {
    c = array[i++]
    switch (c >> 4) {
      case 0:
      case 1:
      case 2:
      case 3:
      case 4:
      case 5:
      case 6:
      case 7:
        // 0xxxxxxx
        out += String.fromCharCode(c)
        break
      case 12:
      case 13:
        // 110x xxxx   10xx xxxx
        char2 = array[i++]
        out += String.fromCharCode(((c & 0x1f) << 6) | (char2 & 0x3f))
        break
      case 14:
        // 1110 xxxx  10xx xxxx  10xx xxxx
        char2 = array[i++]
        char3 = array[i++]
        out += String.fromCharCode(((c & 0x0f) << 12) | ((char2 & 0x3f) << 6) | ((char3 & 0x3f) << 0))
        break
    }
  }
  return out
}


//解压缩
// 解压
export function unzipFun(strData:string) {
  try{
    strData = atob(strData)
  } catch {
    // 旧数据是JSON, 直接解析
    return JSON.parse(strData)
  }
  // Convert binary string to character-number array
  // console.log('...解压strData', strData);
  // var charData = strData.split('').map(function (x) {
  //   return x.charCodeAt(0)
  // })
  var charData = strData.split(',').map(x => Number(x))
  // console.log('...解压charData', charData);
  // Turn number array into byte-array
  var binData = new Uint8Array(charData)
  // unzip
  try {
    var data = pako.inflate(binData, { to: 'string' })
    // Convert gunzipped byteArray back to ascii string:
    // return JSON.parse(Utf8ArrayToStr(data))
    return JSON.parse(data)
  } catch (error:any) {
    console.log("unzip error:",  error);
    return false
  }
}

// 压缩
export function zipFun(data:any, name?:string) {
  if(!isString(data)) {
    data = JSON.stringify(data)
  }
  var binaryString = pako.deflate(data, { to: "string" });
  return btoa(binaryString)
}